package com.ruoyi.system.outto.goods.impl;

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.V2.gameAttr.mapper.GameAttrTemplateMapper;
import com.ruoyi.system.V2.gameAttr.mapper.GameAttributeMapper;
import com.ruoyi.system.V2.goodInfo.mapper.GoodsInfoImgMapper;
import com.ruoyi.system.V2.inter.mapper.ArtRecMapper;
import com.ruoyi.system.interAttr.domain.InterAttr;
import com.ruoyi.system.interAttr.mapper.InterAttrMapper;
import com.ruoyi.system.model.domain.ArtRec;
import com.ruoyi.system.model.domain.GameAttrTemplate;
import com.ruoyi.system.model.domain.SalePartner;
import com.ruoyi.system.model.dto.GoodsInfoAndAttrValueDto;
import com.ruoyi.system.outto.goods.YUELIANGDAISHOUAPI;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author lz
 * @version 1.0
 * @date 2022/6/5 16:19
 */
@Slf4j
@Service
public class YUELIANGDAISHOUAPIImpl implements YUELIANGDAISHOUAPI {

    @Resource
    private GameAttrTemplateMapper gameAttrTemplateMapper;
    @Resource
    private GameAttributeMapper gameAttributeMapper;
    @Resource
    private GoodsInfoImgMapper goodsInfoImgMapper;
    @Resource
    private ArtRecMapper artRecMapper;
    @Resource
    InterAttrMapper interAttrMapper;

    @Override
    public AjaxResult addGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        Map<String, Object> params = params(goodsInfoAndAttrValueDto, salePartner);
        Map<String, Object> result = new HashMap<>();
        String cover = JSONObject.toJSONString(params)+salePartner.getOther();
        String sign = DigestUtils.md5Hex(cover);
        String response = HttpRequest.post("https://b.yuebp.com/prod-api/open/commodity/sync").header("user-key", sign)
                .body(JSONObject.toJSONString(params)).execute().body();
        log.info("月亮代售添加接口请求参数={}", JSONObject.toJSONString(params));
        log.info("月亮代售添加接口返回参数={}", response);
        JSONObject resultJson = JSONObject.parseObject(response);
        if (!"200".equals(resultJson.getString("code"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
            result.put("outId", String.valueOf(goodsInfoAndAttrValueDto.getId()));
        }
        result.put("msg", resultJson.getString("msg"));
        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        return AjaxResult.success(result);
    }

    @Override
    public AjaxResult editGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        Map<String, Object> params = params(goodsInfoAndAttrValueDto, salePartner);
        Map<String, Object> result = new HashMap<>();
        String cover = JSONObject.toJSONString(params)+salePartner.getOther();
        String sign = DigestUtils.md5Hex(cover);
        String response = HttpRequest.post("https://b.yuebp.com/prod-api/open/commodity/sync").header("user-key", sign)
                .body(JSONObject.toJSONString(params)).execute().body();
        log.info("月亮代售编辑接口请求参数={}", JSONObject.toJSONString(params));
        log.info("月亮代售编辑接口返回参数={}", response);
        JSONObject resultJson = JSONObject.parseObject(response);
        if (!"200".equals(resultJson.getString("code"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
        }
        result.put("msg", resultJson.getString("msg"));
        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        return AjaxResult.success(result);
    }

    private void builderServer(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, Map commodity, String server) {
        //========================开始匹配区服属性=====================//
        JSONObject jsonObject = JSONObject.parseObject(server);
        //开始匹配一级区服
        String interServeReqs = jsonObject.getString("interServeReqs");
        String qufuid = "";
        JSONObject oneServerJson = new JSONObject();
        if (Objects.equals(goodsInfoAndAttrValueDto.getGameType(), "0")) {
            qufuid = goodsInfoAndAttrValueDto.getSystemId() + "";
            List<JSONObject> oneServer = JSONObject.parseArray(interServeReqs, JSONObject.class);
            for (JSONObject object : oneServer) {
                String ydServeId = object.getString("YdServeId");
                if (StringUtils.isNotEmpty(ydServeId)) {
                    ydServeId = ydServeId.replace(",", "").replace(" ", "");
                    if (ydServeId.contains(qufuid)) {
                        commodity.put("zoneId", object.getString("id"));
                        String interServerRes = object.getString("interServerRes");
                        List<JSONObject> twoServer = JSONObject.parseArray(interServerRes, JSONObject.class);
                        for (JSONObject object2 : twoServer) {
                            if (Objects.equals(object2.getString("YdServeId"), goodsInfoAndAttrValueDto.getCarrierId()+"")) {
                                commodity.put("serverId", object2.getString("id"));
                                break;
                            }
                        }
                    }
                }
            }
        } else if (Objects.equals(goodsInfoAndAttrValueDto.getGameName(), "无畏契约")) {
            qufuid = goodsInfoAndAttrValueDto.getGroupId() + "";
            List<JSONObject> oneServer = JSONObject.parseArray(interServeReqs, JSONObject.class);
            for (JSONObject object : oneServer) {
                String ydServeId = object.getString("YdServeId");
                if (StringUtils.isNotEmpty(ydServeId)) {
                    ydServeId = ydServeId.replace(",", "").replace(" ", "");
                    if (Objects.equals(qufuid, ydServeId)) {
                        commodity.put("zoneId", object.getString("id"));
                    }
                }
            }
        }
        else {
            qufuid = goodsInfoAndAttrValueDto.getGroupId() + "";
            List<JSONObject> oneServer = JSONObject.parseArray(interServeReqs, JSONObject.class);
            for (JSONObject object : oneServer) {
                String ydServeId = object.getString("YdServeId");
                if (StringUtils.isNotEmpty(ydServeId)) {
                    ydServeId = ydServeId.replace(",", "").replace(" ", "");
                    if (Objects.equals(qufuid, ydServeId)) {
                        commodity.put("zoneId", object.getString("id"));
                        String interServerRes = object.getString("interServerRes");
                        List<JSONObject> twoServer = JSONObject.parseArray(interServerRes, JSONObject.class);
                        for (JSONObject object2 : twoServer) {
                            if (Objects.equals(object2.getString("YdServeId"), goodsInfoAndAttrValueDto.getServerId()+"")) {
                                commodity.put("serverId", object2.getString("id"));
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * 开始匹配单选属性
     *
     * @param goodsInfoAndAttrValueDto
     * @param radioAttr
     */
    private void builderRadioAttr(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, String radioAttr, JSONArray valueList) {
        //========================开始匹配单选属性=====================//
        JSONObject jsonObject = JSONObject.parseObject(radioAttr);
        String interRadioReqs = jsonObject.getString("interRadioReqs");
        log.info(JSONObject.toJSONString(interRadioReqs));
        List<JSONObject> jsonObjects = JSONObject.parseArray(interRadioReqs, JSONObject.class);
        if (org.springframework.util.CollectionUtils.isEmpty(jsonObjects)) {
            throw new GlobalException("接口单选属性暂未配置");
        }
        /**
         * 1、先查询自定义中所有单选的字段
         * 2、再查该账号单选字段中的选项
         * 3、再去接口属性匹配表过滤
         */
        GameAttrTemplate gameAttrTemplate = new GameAttrTemplate();
        gameAttrTemplate.setGameId(goodsInfoAndAttrValueDto.getGameId());
        gameAttrTemplate.setIsEnable("0");
        gameAttrTemplate.setFieldType("radio");
        List<GameAttrTemplate> gameAttrTemplates = gameAttrTemplateMapper.selectGameAttrTemplateList(gameAttrTemplate);
        Field[] declaredFields = goodsInfoAndAttrValueDto.getClass().getDeclaredFields();


        List<JSONObject> defObjects = new ArrayList<>();
        defObjects.addAll(jsonObjects);
        for (JSONObject object : jsonObjects) {
            for (GameAttrTemplate attrTemplate : gameAttrTemplates) {
                JSONObject att = new JSONObject();
                String aavName = attrTemplate.getAavName();
                for (Field declaredField : declaredFields) {
                    String name = declaredField.getName();
                    if (aavName.equals(name)) {
                        //一级属性
                        //注意 YdConfigId 对应的是 f字段对应的 id
                        if (Objects.equals(object.getLong("YdConfigId"), attrTemplate.getId())) {
                            Integer InterConfigId = object.getInteger("id");
                            defObjects.remove(object);//如果匹配上，则去掉
                            String interRadioReqs1 = object.getString("interRadioReqs");
                            List<JSONObject> jsonObjects2 = JSONObject.parseArray(interRadioReqs1, JSONObject.class);
                            declaredField.setAccessible(true);
                            try {
                                //获取选择的值 例如  实名中的可二次
                                Object o = declaredField.get(goodsInfoAndAttrValueDto);
                                String oneValue = String.valueOf(o);
                                List<JSONObject> twoAttr = jsonObjects2.stream().filter(j -> StringUtils.isNotEmpty(j.getString("YdConfigId"))?j.getString("YdConfigId").contains(oneValue):"111".contains(oneValue)).collect(Collectors.toList());
                                String interConfigName = object.getString("InterConfigName");
                                String defaultValue = object.getString("defaultValue");
                                if (org.springframework.util.CollectionUtils.isEmpty(twoAttr)) {
                                    if (StringUtils.isNotEmpty(defaultValue)) {
                                        att.put("fieldId", InterConfigId);
                                        att.put("fieldValue", defaultValue);
                                        valueList.add(att);
                                    }
                                }
//                                if (org.springframework.util.CollectionUtils.isEmpty(twoAttr) && StringUtils.isEmpty(defaultValue)) {
//                                    throw new GlobalException("属性" + interConfigName + " 接口要求必传，但是暂未匹配到，请设置默认值");
//                                }
                                if (!org.springframework.util.CollectionUtils.isEmpty(twoAttr)) {
                                    JSONObject jsonObject2 = twoAttr.get(0);
                                    String interConfigId2 = jsonObject2.getString("id");
                                    att.put("fieldId", InterConfigId);
                                    att.put("fieldValue", interConfigId2);
                                    valueList.add(att);
                                }
                            } catch (Exception e) {
                                throw new GlobalException("单选项" + attrTemplate.getFieldName() + "匹配错误");
                            }
                        }
                    }
                }
            }
        }
        //开始匹配默认值
        for (JSONObject object : defObjects) {
            JSONObject att = new JSONObject();
            Integer id = object.getInteger("id");
            interRadioReqs = object.getString("interRadioReqs");
            jsonObjects = JSONObject.parseArray(interRadioReqs, JSONObject.class);
            for (JSONObject objects : jsonObjects) {
                if(StringUtils.isNotEmpty(objects.getString("defaultValue"))){
                    att.put("fieldId", id);
                    att.put("fieldValue", objects.getString("id"));
                    valueList.add(att);
                }
            }
        }
        //========================单选属性匹配结束=====================//
    }

    private void builderCheckAttr(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, String checkAttr, JSONArray valueList) {
        /**
         * 1、先查询自定义中所有多选的字段
         * 2、再查该账号单选字段中的选项
         * 3、再去接口属性匹配表过滤
         */
        Field[] declaredFields = goodsInfoAndAttrValueDto.getClass().getDeclaredFields();
        JSONObject checkAttrJson = JSONObject.parseObject(checkAttr);
        String interCheckBoxReqs = checkAttrJson.getString("interCheckBoxReqs");
        List<JSONObject> checkJsonList = JSONObject.parseArray(interCheckBoxReqs, JSONObject.class);
        if (org.springframework.util.CollectionUtils.isEmpty(checkAttrJson)) {
            throw new GlobalException("接口多选属性暂未配置");
        }

        GameAttrTemplate gameAttrTemplate = new GameAttrTemplate();
        gameAttrTemplate.setGameId(goodsInfoAndAttrValueDto.getGameId());
        gameAttrTemplate.setIsEnable("0");
        List<String> types = new ArrayList<>();
        types.add("checkbox");
        types.add("boxradio");
        gameAttrTemplate.setFieldTypes(types);
        List<GameAttrTemplate> checkAttrTemplates = gameAttrTemplateMapper.selectGameAttrTemplateList(gameAttrTemplate);

        for (JSONObject object : checkJsonList) {
            JSONObject attr = new JSONObject();
            String pf_ids = "";
            for (GameAttrTemplate attrTemplate : checkAttrTemplates) {

                String aavName = attrTemplate.getAavName();
                for (Field declaredField : declaredFields) {
                    String name = declaredField.getName();
                    if (aavName.equals(name)) {
                        declaredField.setAccessible(true);

//                        List<String> list2 = new ArrayList<>();
//                        for (String s : split2) {
//                            s = s.replace(" ", "");
//                            list2.add(s);
//                        }
                        Object o = null;
                        try {
                            o = declaredField.get(goodsInfoAndAttrValueDto);
                        } catch (IllegalAccessException e) {
                            throw new GlobalException("多选项" + attrTemplate.getFieldName() + "匹配错误");
                        }
                        String oneValue = String.valueOf(o);
                        String interCheckBoxReqsStr = object.getString("interCheckBoxReqs");
                        //开始匹配二级属性
                        List<JSONObject> jsonObjects2 = JSONObject.parseArray(interCheckBoxReqsStr, JSONObject.class);
                        /**
                         * 咱们的f字段  多选项都是用空格 隔开，用,号切割数组，跟匹配的数据匹配、匹配上说明此账号勾选的有此属性
                         */
                        for (JSONObject jsonObject1 : jsonObjects2) {
                            String[] split1 = oneValue.split(",");
                            String ydConfigId1 = jsonObject1.getString("YdConfigId");
                            for (String s : split1) {
                                if (Objects.equals(s, ydConfigId1)) {
                                    String InterConfigId2 = jsonObject1.getString("id");
                                    pf_ids+=","+InterConfigId2;
                                }
                            }
                        }

                    }
                }
            }
            if (StringUtils.isNotEmpty(pf_ids)) {
                attr.put("fieldId", object.getInteger("id"));
                attr.put("fieldValue", pf_ids.substring(1).trim());
                valueList.add(attr);
            }
        }
    }

    private Map<String, Object> params(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        //自动匹配开始
        String substring = salePartner.getSaleName().substring(salePartner.getSaleName().indexOf("_")+1);
        InterAttr interAttr = interAttrMapper.selectInterAttrByConfig(substring, goodsInfoAndAttrValueDto.getGameId());

        Map<String, Object> params = new HashMap<>();
        Map<String, Object> commodity = new HashMap<>();
        params.put("appId", salePartner.getSaleKey());
        commodity.put("gameId", interAttr.getInterGameId());
        List<Map<String, Object>> urlArr = goodsInfoAndAttrValueDto.getUrlArr();
        StringBuffer imgs = new StringBuffer();
        if(StringUtils.isNotEmpty(goodsInfoAndAttrValueDto.getTitleImg())){
            imgs.append(goodsInfoAndAttrValueDto.getTitleImg()+",");
        }
        for(Map<String, Object> maps : urlArr){
            String ss = String.valueOf(maps.get("url"));
            String imgStr = ss + ",";
            imgs.append(imgStr);
        }
        String imgUrls = imgs.toString().substring(0, imgs.length() - 1);
        commodity.put("image", imgUrls);
        commodity.put("price", goodsInfoAndAttrValueDto.getPrice());
        commodity.put("title", goodsInfoAndAttrValueDto.getTitle());
        commodity.put("content", goodsInfoAndAttrValueDto.getDes());
        commodity.put("tripartiteNumber", goodsInfoAndAttrValueDto.getId());
        JSONArray valueList = new JSONArray();
        //开始匹配单选属性
        builderRadioAttr(goodsInfoAndAttrValueDto, interAttr.getRadioAttr(),valueList);
        //开始匹配多选属性
        builderCheckAttr(goodsInfoAndAttrValueDto, interAttr.getCheckAttr(),valueList);
        commodity.put("valueList",valueList);
        //区服
        builderServer(goodsInfoAndAttrValueDto, commodity, interAttr.getServer());
        params.put("commodity", commodity);
        return params;
    }


    @Override
    public AjaxResult delGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        Map<String, Object> params = new TreeMap<>();
        Map<String, Object> commodity = new TreeMap<>();
        Map<String, Object> result = new HashMap<>();
        ArtRec artRecreq = new ArtRec();
        artRecreq.setConfig(salePartner.getId());
        artRecreq.setAccountId(goodsInfoAndAttrValueDto.getId());
        List<ArtRec> artRecs = artRecMapper.selectArtRecList(artRecreq);
        ArtRec artRec = artRecs.get(0);
        params.put("appId",salePartner.getSaleKey());
        commodity.put("tripartiteNumber",artRec.getOutid());
        params.put("commodity",commodity);
        String cover = JSONObject.toJSONString(params)+salePartner.getOther();
        String sign = DigestUtils.md5Hex(cover);
        String response = HttpRequest.post("https://b.yuebp.com/prod-api/open/commodity/under").header("user-key", sign)
                .body(JSONObject.toJSONString(params)).execute().body();
        log.info("月亮代售删除接口请求参数={}", JSONObject.toJSONString(params));
        log.info("月亮代售删除接口返回参数={}", response);
        JSONObject resultJson = JSONObject.parseObject(response);
        if (!"200".equals(resultJson.getString("code"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
        }
        artRecMapper.updateArtRec(artRec);
        result.put("msg", resultJson.getString("msg"));
        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        return AjaxResult.success(result);
    }

    public static void main(String[] args) {

        /*JSONObject resultJson1 = JSONObject.parseObject(response);
        log.info(resultJson1);
        JSONArray array = JSONArray.parseArray(resultJson1.get("data").toString());
        for(Object o : array){
            log.info(JSONObject.parseObject(o.toString()).get("propertyname"));
        }*/
        /*JSONObject resultJson1 = JSONObject.parseObject(response);
        JSONArray jsonArray = JSONArray.parseArray(resultJson1.getString("arealist"));
        for (Object o : jsonArray){
            log.info(o);
        }*/
//        String response = games();
        SalePartner salePartner = new SalePartner();
        salePartner.setSaleKey("JDKRUEIUREN89340JIEJRJIERASD");
        salePartner.setOther("http://api.taohaoge.com/interfaces");
        salePartner.setTwoOther("zuyoule");
        String response = youxiqufu(18,salePartner);

        log.info(response);
    }

    public static String kuozhanshuxing(int type, SalePartner salePartner) {
        Map<String, Object> params1 = new TreeMap<>();
        Map<String, Object> head = new HashMap<>();
        head.put("content-type", "application/x-www-form-urlencoded");
        params1.put("key", salePartner.getSaleKey());
        params1.put("merchant_no", salePartner.getTwoOther());
        params1.put("gameid", type);
        params1.put("content-type", "application/x-www-form-urlencoded");
        String response = HttpUtils.doPostForm(salePartner.getOther() + "/getExpendAttribute.ashx", params1, head);
        if(StringUtils.isEmpty(response)){
            throw new GlobalException("获取月亮代售属性失败!!!");
        }
        JSONObject resultJson = JSONObject.parseObject(response);
        if(!"true".equals(resultJson.getString("succ"))){
            throw new GlobalException(response);
        }
        return response;
    }

    public static String youxiqufu(int type, SalePartner salePartner) {
        Map<String, Object> params1 = new TreeMap<>();
        Map<String, Object> head = new HashMap<>();
        head.put("content-type", "application/x-www-form-urlencoded");
        params1.put("key", salePartner.getSaleKey());
        params1.put("merchant_no", salePartner.getTwoOther());
        params1.put("gameid", type);
        params1.put("content-type", "application/x-www-form-urlencoded");
        String URL = salePartner.getOther() + "/getAreaServer.ashx";
        String response = HttpUtils.doPostForm(URL, params1, head);
        if(StringUtils.isEmpty(response)){
            throw new GlobalException("获取月亮代售区服失败!!!");
        }
        JSONObject resultJson = JSONObject.parseObject(response);
        if(!"true".equals(resultJson.getString("succ"))){
            throw new GlobalException(response);
        }
        return response;
    }

    public static String games(SalePartner salePartner) {
        Map<String, Object> params1 = new TreeMap<>();
        Map<String, Object> head = new HashMap<>();
        head.put("content-type", "application/x-www-form-urlencoded");
        params1.put("key", salePartner.getSaleKey());
        params1.put("merchant_no", salePartner.getTwoOther());
        params1.put("content-type", "application/x-www-form-urlencoded");
        String response = HttpUtils.doPostForm(salePartner.getOther() + "/getGameInfor.ashx", params1, head);
        if(StringUtils.isEmpty(response)){
            throw new GlobalException("获取月亮代售游戏失败!!!");
        }
        JSONObject resultJson = JSONObject.parseObject(response);
        if(!"true".equals(resultJson.getString("succ"))){
            throw new GlobalException(response);
        }
        return response;
    }

    public static String getGameID(String gameName, SalePartner salePartner) {
        String response = games(salePartner);
        String data = JSONObject.parseObject(response).getString("data");
        return null;
    }

}
